package com.xianggu.designMode.templateMethod;

// 抽象支付模板
public abstract class AbstractPay {

    // 模板方法（final防止子类修改流程）
    public final void payProcess() {
        // 钩子方法控制是否执行权限校验
        if (needCheckAuth()) {
            checkAuth();
        }
        checkParams();
        checkRisk();
        channelPay();
    }

    // 具体方法（通用步骤）
    private void checkParams() {
        System.out.println("参数校验...");
    }

    private void checkRisk() {
        System.out.println("风控校验...");
    }

    // 抽象方法（子类必须实现）
    protected abstract void channelPay();

    // 钩子方法（子类可选择性覆盖）
    protected boolean needCheckAuth() {
        return true;  // 默认开启权限校验
    }

    // 权限校验（默认实现）
    protected void checkAuth() {
        System.out.println("支付权限校验...");
    }
}